<!doctype html>
<html lang="en-US">
  <head>
    <title>Web Chat: Password input activity</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <!--
      For simplicity and code clarity, we are using Babel and React from unpkg.com.
    -->
    <script crossorigin="anonymous" src="https://unpkg.com/@babel/standalone@7.8.7/babel.min.js"></script>
    <script crossorigin="anonymous" src="https://unpkg.com/react@16.8.6/umd/react.development.js"></script>
    <script crossorigin="anonymous" src="https://unpkg.com/react-dom@16.8.6/umd/react-dom.development.js"></script>
    <script crossorigin="anonymous" src="https://unpkg.com/react-redux@7.1.0/dist/react-redux.min.js"></script>
    <!--
      This CDN points to the latest official release of Web Chat. If you need to test against Web Chat's latest bits, please refer to using Web Chat's latest bits:
      https://github.com/microsoft/BotFramework-WebChat#how-to-test-with-web-chats-latest-bits
    -->
    <script crossorigin="anonymous" src="https://cdn.botframework.com/botframework-webchat/latest/webchat.js"></script>
    <style>
      html,
      body {
        height: 100%;
      }

      body {
        margin: 0;
      }

      #webchat {
        height: 100%;
        width: 100%;
      }

      .passwordInput {
        margin: 10px;
      }

      .passwordInput .passwordInput__form {
        background-color: Red;
        border-radius: 3px;
        color: White;
        display: flex;
        font-family: Calibri, 'Helvetica Neue', Arial, sans-serif;
        padding: 5px;
      }

      .passwordInput .passwordInput__box {
        display: flex;
        flex: 1;
      }

      .passwordInput .passwordInput__label {
        padding: 10px;
      }

      .passwordInput .passwordInput__input {
        border: 0px;
        border-radius: 3px;
        flex: 1;
        letter-spacing: 0.5em;
        outline: 0;
        padding: 0 10px;
        width: 100%;
      }

      .passwordInput .passwordInput__input:disabled {
        background-color: rgba(255, 255, 255, 0.5);
        color: White;
      }
    </style>
  </head>

  <body>
    <div id="webchat" role="main"></div>
    <script type="text/babel" data-presets="es2015,react,stage-3">
      (async function () {
        'use strict';

        const {
          hooks: { useCreateActivityStatusRenderer, useSendPostBack },
          ReactWebChat
        } = window.WebChat;

        const { useCallback, useState } = window.React;

        const PasswordInputActivity = ({ activity }) => {
          const [twoFACode, setTwoFACode] = useState('');
          const [submitted, setSubmitted] = useState(false);
          const renderActivityStatus = useCreateActivityStatusRenderer()({ activity, sendState: 'sent' });
          const sendPostBack = useSendPostBack();

          const handleCodeChange = useCallback(
            ({ target: { value } }) => {
              setTwoFACode(value);
            },
            [setTwoFACode]
          );

          const handleSubmit = useCallback(
            event => {
              event.preventDefault();

              sendPostBack({ code: twoFACode });
              setSubmitted(true);
            },
            [sendPostBack, setSubmitted, twoFACode]
          );

          return (
            <div className="passwordInput">
              <form className="passwordInput__form" onSubmit={handleSubmit}>
                <label className="passwordInput__box">
                  <span className="passwordInput__label">Please input your 2FA code</span>
                  <input
                    autoComplete="off"
                    autoFocus={true}
                    className="passwordInput__input"
                    disabled={submitted}
                    onChange={handleCodeChange}
                    type="password"
                    value={twoFACode}
                  />
                </label>
              </form>
              {renderActivityStatus({ hideTimestamp: false })}
            </div>
          );
        };

        // In this demo, we are using Direct Line token from MockBot.
        // Your client code must provide either a secret or a token to talk to your bot.
        // Tokens are more secure. To learn about the differences between secrets and tokens
        // and to understand the risks associated with using secrets, visit https://docs.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-direct-line-3-0-authentication?view=azure-bot-service-4.0

        const res = await fetch(
          'https://hawo-mockbot4-token-app.blueriver-ce85e8f0.westus.azurecontainerapps.io/api/token/directline',
          { method: 'POST' }
        );
        const { token } = await res.json();
        const store = createStore();
        const activityMiddleware =
          () =>
          next =>
          ({ activity, ...otherArgs }) => {
            const { name, type } = activity;

            if (type === 'event' && name === 'passwordInput') {
              return () => <PasswordInputActivity activity={activity} />;
            } else {
              return next({ activity, ...otherArgs });
            }
          };

        window.ReactDOM.render(
          <ReactWebChat
            activityMiddleware={activityMiddleware}
            directLine={window.WebChat.createDirectLine({ token })}
            store={store}
          />,
          document.getElementById('webchat')
        );

        store.dispatch({
          type: 'WEB_CHAT/SET_SEND_BOX',
          payload: { text: 'sample:password-input' }
        });

        document.querySelector('#webchat > *').focus();
      })().catch(err => console.error(err));
    </script>
  </body>
</html>
